// #include"TcpServer.hpp"
#include"Calculate.hpp"
#include"Parser.hpp"
#include"Reactor.hpp"
#include"Listener.hpp"
#include<memory>
#include<iostream>
#include<string>

void Usage(std::string proc)
{
    std::cerr << "Usage: " << proc << " serverport";
}

int main(int argc , char* argv[])
{
    if(argc != 2)
    {
        Usage(argv[0]);
        return 0;
    }

    //日志服务
    EnableConsoleLogStrategy();

    uint16_t srverport = std::stoi(argv[1]);

    //创建反应堆，创建监听套接字，将监听套接字放进这个反应堆当中
    // Listener listener;
    // Reactor server;
    // server.AddConnection(listener);

    //上层处理数据的任务
    std::unique_ptr<Calculate> cal = std::make_unique<Calculate>();

    //解析报文返回应答模块
    std::unique_ptr<Parser> parser = std::make_unique<Parser>(
        [&cal](Request& req)->Responce{
            return cal->Exec(req);
        }
    );

    //连接管理器 --> 监听套接字
    //因为监听套接字是暴露出来的，所以Parser 模块添加进监听套接字中，虽然监听套接字用不到这个函数，但是在获取连接的时候
    //可以将这个回调函数设置到连接中
    std::shared_ptr<Listener> listener = std::make_shared<Listener>(srverport);
    listener->SetCallback([&parser](std::string& inbuffer)->std::string{
        return parser->Parse(inbuffer);
    });

    //构建Reactor 容器
    std::unique_ptr<Reactor> R = std::make_unique<Reactor>();
    //将监听套接字放入Reactor 容器中
    R->AddConnection(listener);

    R->Dispatcher();
    
    return 0;
}